


# @functools.cache 详细介绍
# 用于为函数提供简单的内存缓存功能。它是 @functools.lru_cache(maxsize=None) 的一个更简单版本。
from functools import cache

@cache
def factorial(n):
    return n * factorial(n-1) if n else 1


# 工作原理
# ​​缓存机制​​：当使用 @cache 装饰的函数被调用时，它会首先检查缓存中是否已有该输入参数的计算结果。
# ​​缓存命中​​：如果参数在缓存中，直接返回缓存的结果，不再执行函数体。
# ​​缓存未命中​​：如果参数不在缓存中，执行函数体，将结果存入缓存后返回

# 特点
# ​​无大小限制​​：与 lru_cache 不同，cache 没有大小限制，会一直增长直到程序结束。
# ​​哈希参数要求​​：所有参数必须是可哈希的（不可变类型如字符串、数字、元组等）。
# ​​线程安全​​：缓存操作是线程安全的


from functools import cache
import time

@cache
def expensive_calculation(n):
    time.sleep(2)  # 模拟耗时计算
    return n * n

# 第一次调用会耗时
print(expensive_calculation(10))  # 约2秒
# 第二次相同参数调用会立即返回
print(expensive_calculation(10))  # 立即返回


# -------------------------------清除缓存------------------------------------------
def clear_cache(func):
    wrapped = func
    while hasattr(wrapped, '__wrapped__'):
        wrapped = wrapped.__wrapped__
    func = wrapped
    return cache(func)


